package com.qtrue.thread;

/**
 * @Package: com.qtrue.thread
 * @ClassName: WindowTest05
 * @Author: xiaoBao
 * @CreateTime: 2022-05-08 19:12
 * @Description:通过“同步方法”解决继承Thread类的线程安全问题
 */
public class WindowTest05 {
    public static void main(String[] args) {
        // 创建4个window对象，用来启动四个线程
        Window window01 = new Window();
        Window window02 = new Window();
        Window window03 = new Window();
        Window window04 = new Window();

        // 设置线程名称
        window01.setName("窗口一：");
        window02.setName("窗口二：");
        window03.setName("窗口三：");
        window04.setName("窗口四：");

        // 启动线程
        window01.start();
        window02.start();
        window03.start();
        window04.start();
    }
}

class Window4 extends Thread {
    // 总票数：使用static修饰
    private static int ticket = 100;

    @Override
    public void run() {

        while (true) {
                showMethod();
        }

    }

    // 同步方法（操作共享数据的代码）
    private static synchronized void showMethod(){ // 同步监视器：Window4.class（当前类）
//    private synchronized void showMethod(){ // 同步监视器：t1,t2,t3,t4（错误的解决方式：每new一次都会有新的锁，导致多个线程共用的不是同一把锁）
        if(ticket > 0){
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }

            System.out.println(Thread.currentThread().getName() + "：卖票，票号为：" + ticket);

            ticket--;
        }
    }
}